// 处理服务端返回的路由表
import setRoutes from '@/utils/set-routes-server'
import router, { constantRoutes } from '@/router'

const state = {
    routes: [],
    addRoutes: []
}

const mutations = {
    SET_ROUTES: (state, routes) => {
        // 设置增加路由
        state.addRoutes = routes
        // 设置所有路由
        state.routes = constantRoutes.concat(routes)
    }
}

const actions = {
    /**
     * ****** 必填
     * 主要解决问题：用户强制将路由输入为login需要清空token，
     * 1. 如果在路由拦截中设置to.login，由于addRoutes方法导致路由无线循环（异步调用），导致next(to)至登录页，
     *    导致调用拦截中清空token操作导致登录失败
     * 解决方案一:
     * ## 在这里提前调用replace方法将to.path清空路由缓存记录 如此异步添加路由后在next（to）中to成为我们刚才替换的路由
     * router.replace(to.path)
     * 解决方案二：
     * ## 在登录事件触发前清空token
     * 解决方案三：
     * ## 判断form与to都等于登录页则放行
     */
    getRoutes({ commit }, { roles, to }) {
        return new Promise((resolve, reject) => {
            // 根据权限生成路由表
            const accessedRoutes = setRoutes(roles)
            commit('SET_ROUTES', accessedRoutes)
            // 回调
            resolve(accessedRoutes)
        })
    }
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}
